Unit Clients;

Interface
Uses Types,Comptes;

//OK Retourne l'indice de notre collection ou se trouve notre client
Function indiceClient(ID_client:INTEGER ; collectionClient : TTabClient): INTEGER;

//OK Retourne les informations du client
Procedure afficheclient(ID_Client : INTEGER; collectionClient : TTabclient);

//OK Retourne tous les clients de notre collection sans leur compte
Procedure listing(collectionClient : TTabClient);

//OK Retourne une liste de client qui correspondent aux paramètres saisis	
Function rechercheClient(collectionClient : TTabClient; nom : STRING; prenom : STRING): INTEGER;

{//Recherche un client en fonction de son ID
Function rechercheClienID(ID_Client : INTEGER; collectionClient : TTabClient): TClient;}

//?? Affiche tous les clients ainsi que leur(s) compte(s) respectif(s)
Procedure afficheALLclient(recClient:TTabclient; recCompte : TTabcompte);

//OK Permet la modification des données de notre client
Procedure modificationClient(ID_Client : INTEGER ; var collectionClient : TTabclient);

//?? Supprime un client de notre collection tout en clôturant ses comptes
PROCEDURE suppressionClient(ID_Client : INTEGER; VAR collectionClient : TTabClient; collectionCompte : TTabcompte);  

//OK Crée un nouveau client et l'enregistre dans notre collection
Procedure creationClient(VAR collectionClient : TTabClient);

//OK Ajoute un nouveau client à notre collection 
Procedure addClient(var collectionClient : TTabClient; client : TClient);

//OK Enregistre les modifications faites sur un client existant
Procedure enregistrementClient(ID_Client:Integer; VAR collectionClient:TTabClient; client:TClient);

//OK Retourne le client présent à la case i de la collection
Function findClient(collectionClient:TTabClient; i:INTEGER):TClient;

//OK Affiche la liste des client puis demande l'indice désiré à l'utilisateur
Function selectClient(collectionClient : TTabClient): INTEGER;

//OK Retourne l'ID du client en fonction de son emplacement dans la collection
Function id(i : integer ; collectionClient : TTabClient) : integer;

{//Calcule le nombre de compte(s) qu'a notre client	
Function nombreCompte(ID_client : INTEGER; collectionCompte : TTabcompte): INTEGER;}

implementation

//OK Retourne l'indice de notre collection ou se trouve notre client
Function indiceClient(ID_client:INTEGER ; collectionClient : TTabClient): INTEGER;
var 
	i : INTEGER;

BEGIN
	i:=1;
	WHILE (ID_client <> collectionClient.tabclient[i].ID) AND (i<=collectionClient.nbelement) DO 
		BEGIN			//Boucle qui compare notre ID_Client à l'ID_Client de notre tableau et s'arrête sitôt qu'on se trouve à la hauteur de l'enregistrement
			i:=i + 1;
		END;
	IF(i > collectionClient.nbelement) THEN
		i:=-1;			//Si à la fin de la boucle il n'a tjrs pas trouvé, il donne la valeur -1 pour définir un cas de sortie;	
	indiceClient:=i;
END;
	{Var
		i : INTEGER;
		trouve : BOOLEAN;
	begin
		i := 1;
		trouve := FALSE;
		indiceClient := 0;
		WHILE (i <= collectionClient.nbelement) AND (NOT trouve) DO
			begin
				IF	
				(collectionClient.tabclient[i].ID = ID_client) THEN
					begin
						indiceClient := i;
						trouve := true;
					end
				ELSE
					i := i + 1;
			end;
	end;}
	
//OK Retourne les informations du client	
{Procedure afficheclient(ID_Client : INTEGER ;collectionClient : TTabclient);		//transformer en procedure parce que on retourne rien
																		//Définition du nom de notre fonction ainsi que ses paramètres en entrée-sortie	
	Var 
		i : INTEGER;
	Begin
		i := indiceClient(ID_Client,collectionClient);																//Appel de la fonction indiceclient
		WRITELN('ID: ',collectionClient.tabclient[i].ID);																//Affiche toutes les informations concernant un client depuis le tableau
		WRITELN('Nom: ',collectionClient.tabclient[i].nom);
		WRITELN('Prenom: ',collectionClient.tabclient[i].prenom);
		WRITELN('Date de naissance: ',collectionClient.tabclient[i].naissance);
		WRITELN('Politesse : ',collectionClient.tabclient[i].politesse);
		WRITELN('Adresse: ',collectionClient.tabclient[i].adresse);
		WRITELN('NPA : ',collectionClient.tabclient[i].npa);
		WRITELN('Localite : ',collectionClient.tabclient[i].localite);
		WRITELN('Numero de telephone : ',collectionClient.tabclient[i].telephone);
	End;}
	
//OK Retourne les informations du client
Procedure afficheclient(ID_Client : INTEGER ; collectionClient : TTabclient);		//transformer en procedure parce que on retourne rien
																		//Définition du nom de notre fonction ainsi que ses paramètres en entrée-sortie	
	Var 
		i : INTEGER;
	Begin
		i := indiceClient(ID_Client,collectionClient);
		WRITELN('----------------------------------------------');																//Appel de la fonction indiceclient
		WRITELN('ID : ',collectionClient.tabclient[i].ID);																//Affiche toutes les informations concernant un client depuis le tableau
		WRITELN('Nom : ',collectionClient.tabclient[i].nom);
		WRITELN('Prenom : ',collectionClient.tabclient[i].prenom);
		WRITELN('Date de naissance : ',collectionClient.tabclient[i].naissance);
		WRITELN('Politesse : ',collectionClient.tabclient[i].politesse);
		WRITELN('Adresse : ',collectionClient.tabclient[i].adresse);
		WRITELN('NPA : ',collectionClient.tabclient[i].npa);
		WRITELN('Localite : ',collectionClient.tabclient[i].localite);
		WRITELN('Numero de telephone : ',collectionClient.tabclient[i].telephone);
		WRITELN('Indice client : ',i);
		WRITELN('----------------------------------------------');
		WRITELN('');
		
	End;


//OK Retourne tous les clients de notre collection sans leur compte
PROCEDURE listing(collectionClient : TTabClient);															//Définition du nom de notre procédure ainsi que ses paramètres en entrée-sortie (changé vu qu'on a pas de sortie)
	Var
		i:INTEGER;
	Begin
		i:=1;
		WHILE(i<=collectionClient.nbelement) DO
			begin
				afficheclient(collectionClient.tabclient[i].ID,collectionClient);						//Listing complet des clients
				WRITELN('**********************************************');
				WRITELN('');
				i:= i+1;
			end;
	end;

//OK Retourne une liste de client qui correspondent aux paramètres saisis	
Function rechercheClient(collectionClient : TTabClient; nom : STRING; prenom : STRING): INTEGER;
	Var
			i : integer;
			//j : integer;
			trouve : BOOLEAN;
			IDClient : INTEGER;
		begin
			rechercheClient := 0;
			//rechercheClient.nbelement := 0;
			i := 1;
			//j := 1;
			trouve := FALSE;
			WRITE('Veuillez saisir le nom du client : ');
			READLN (nom);
			WRITE('Veuillez saisir le prenom du client : ');
			READLN (prenom);
			WHILE (i <= collectionClient.nbelement) DO
				begin
					IF 	(collectionClient.tabclient[i].nom = nom) AND
						(collectionClient.tabclient[i].prenom = prenom) THEN
						begin
							//rechercheClient.nbelement := rechercheClient.nbelement + 1;
							//rechercheClient.tabclient[j] := findClient(collectionClient,i);
							afficheclient(id(i,collectionClient),collectionClient);
							WRITELN('**********************************************');
							//j := j + 1;
							trouve := TRUE;
						end;													
					i := i + 1;
				end;
			IF (NOT trouve) THEN
				begin
					WRITELN('');
					WRITELN('Ce client n''existe pas');
					rechercheClient := -1;
					WRITELN('');
				end
			ELSE
				begin
					WRITELN('');
					WRITELN('');
					WRITE('Saississez l''ID client de votre client : ');
					READLN(IDClient);
					rechercheClient := IDClient;
				end; 
		end;

{//Recherche un client en fonction de son ID
Procedure rechercheClienID(ID_Client : INTEGER; collectionClient : TTabClient);
	Var
		i : INTEGER;
	begin
		WRITE('Quel est l''ID du client :');
		READ(ID_Client);
		i := 1;
		WHILE (ID_Client <> collectionClient.tabclient[i].ID) DO
			begin
				i := i + 1;
			end;
		afficheClient(ID_Client,collectionClient);	
		rechercheClienID := collectionClient.tabclient[i];
	end;}

//Affiche tous les clients ainsi que leur(s) compte(s) respectif(s)		
PROCEDURE afficheALLclient(recClient:TTabclient;  recCompte:TTabcompte);
	// on reprend les types tableaux
		VAR
			i:INTEGER;
			j:INTEGER;
			comptepos:INTEGER;
			
		BEGIN
			i:=1;
			
			WHILE(i <= recClient.nbelement) DO
				BEGIN
					j:=1;
					comptepos:=0;
					WRITELN('---------------------------------------------------');
					WRITELN('ID: ',recClient.tabclient[i].ID, ' - ',recClient.tabclient[i].nom,' ',recClient.tabclient[i].prenom);
					
					WHILE (j<=recCompte.nbcompte) DO
						BEGIN
							IF(recClient.tabclient[i].ID=recCompte.tabcompte[j].IDclient) THEN
								BEGIN
									comptepos:=comptepos+1;
								END;
							j:=j+1;
							
							
						END;
						WRITELN('Ce client possede ',comptepos,' compte(s)');	
						WRITELN('---------------------------------------------------');
						WRITELN('');
					i:=i+1;
				END;
				
				
		END;

//OK Permet la modification des données de notre client		
Procedure modificationClient(ID_Client : INTEGER ; var collectionClient : TTabclient);		//transformer en procedure parce que on retourne rien
																			//Définition du nom de notre fonction ainsi que ses paramètres en entrée-sortie	
	VAR	
	//client
		clienttemp : TClient;
		indice : INTEGER;
		choix:STRING; //... si on a un caractère pour quitter(#), les choix doivent être en VARCHAR
		quitter:BOOLEAN;
		saisie:STRING;
		choixSexe : STRING;
	
	BEGIN
		indice:=indiceClient(ID_Client, collectionClient);	
		//Appel de l'indice client
		// creation des variables
		clienttemp:=collectionClient.tabclient[indice];
	    //boucle tant que la sauvegarde n'est pas demandée
		quitter:=false;
		choix:='1';
		WHILE(NOT quitter) DO
			Begin
				choix:='';
				//Affichage des données clients
				WRITELN('   ID                   ',clienttemp.ID);
				WRITELN('1. Nom :                ',clienttemp.nom);
				WRITELN('2. Prenom :             ',clienttemp.prenom);
				WRITELN('3. Date de naissance :  ',clienttemp.naissance);
				WRITELN('4. Politesse :          ',clienttemp.politesse);
				WRITELN('5. Adresse :            ',clienttemp.adresse);                                      
				WRITELN('6. NPA :                ',clienttemp.npa);
				WRITELN('7. Localite :           ',clienttemp.localite);
				WRITELN('8. Numero de telephone :',clienttemp.telephone);
				WRITELN('');
				WRITELN('S -> Quitter et sauver');
				WRITELN('# -> Quitter sans sauver');
				//choix du point à modifier
				WRITELN('Choisissez la donnee a modifier (Entrer le numero) : ');
				READLN(choix);
				CASE (choix)OF																					//Mofication des données des clients d'après le menu de choix
				'1':	
					begin
					WRITE('Nom :');																				//Modification du nom
					READ(saisie);
					clienttemp.nom:=saisie;
					end;
					
				'2':
					begin
					WRITE('Prenom :');																			//Modification du prénom
					READ(saisie);
					clienttemp.prenom:=saisie;
					end;
				'3':
					Begin
					WRITE('Date de naissance :');																	//Modification de la date de naissance
					READ(saisie);
					clienttemp.naissance:=saisie;
					end;
				'4':
					begin;
					WRITELN('Politesse :');
					WRITELN('1. Monsieur');
					WRITELN('2. Madame');
					READLN (choixSexe);
						CASE (choixSexe) OF
							'1':
								begin
									clienttemp.politesse := 'Monsieur';
								end;
							'2':
								begin
									clienttemp.politesse := 'Madame';
								end;	
						end;																//Modification de la formule de politesse
					{READ(saisie);
					clienttemp.politesse:=saisie;}
					end;
				'5':
					begin
					WRITE('Adresse :');																			//Modification de l'adresse
					READ(saisie);
					clienttemp.adresse:=saisie;
					end;
				'6':
					begin
					WRITE('NPA :');																				//Modification du code postal
					READ(saisie);
					clienttemp.npa:=saisie;
					end;
				'7':
					begin
					WRITE('Localite :');																		//Modification de la localité
					READ(saisie);
					clienttemp.localite:=saisie;
					end;
				'8':
					begin
					WRITE('Telephone :');																			//Modification du numéro de téléphone
					READ(saisie);
					clienttemp.telephone:=saisie;
					end;
				'#':
					quitter:=true; //arrêt de la saisie.
					
				'S':	
					begin
					quitter:= true;
					enregistrementClient(ID_Client,collectionClient,clienttemp); 											//Appel de la procédure enregistrementclient
					end;
				END;
			END;																		
		
	END;

{//Supprime un client de notre collection tout en clôturant ses comptes	
PROCEDURE suppressionClient(ID_Client : INTEGER; VAR collectionClient : TTabClient; collectionCompte : TTabcompte); 

		VAR
			nbCompte:INTEGER;
			suppression:BOOLEAN;
			choix:STRING;
			i:INTEGER;
			j:INTEGER;
		BEGIN
		//collectionCompte.nbcompte := 2;
		nbCompte:=2;
		suppression := FALSE;
		j := 0;
		WHILE(NOT suppression) DO 
			BEGIN
				//nbCompte:= afficheComptes(ID_Client, tabcompte); // FONCTION
				//collectionCompte.nbcompte:= afficheComptes(ID_Client, tabcompte);
				//nbCompte:= afficheComptes(ID_Client, tabcompte);
				//nbCompte := 2;
				IF(nbCompte >= 1) THEN
					BEGIN
						WRITELN('Vous devez cloturer les comptes pour supprimer le client');
						WRITELN('Souhaitez-vous cloturer des comptes ? O/N');
						READ(choix);
						
						IF(choix='O') THEN
							BEGIN
								WHILE(j <= collectionCompte.nbcompte) DO
									BEGIN
										IF(ID_Client = collectionCompte.tabcompte[j].IDclient) THEN
											BEGIN
												//Cloture(ID_Client,tabcompte); //FONCTION
											END;
										j:=j+1;
									END;
							END
						ELSE
							BEGIN
							suppression := TRUE;
							END;
					END
				ELSE
					BEGIN
						WRITELN('Confirmez la suppression du client ? O/N');
						READ(choix);
						
						IF(choix='O') THEN
							BEGIN
								//i:=indiceClient(ID_Client,collectionclient); //FONCTION
								i:=1;
								WHILE(i <= collectionClient.nbelement) DO
									BEGIN
										collectionClient.tabclient[i] := collectionClient.tabclient[i+1];
										i:=i+1;
									END;
							END
						ELSE
							BEGIN
								suppression := TRUE;
							END;
							
					END;
			END;
			
		END;
}		
PROCEDURE suppressionClient(ID_Client : INTEGER; VAR collectionClient : TTabClient; collectionCompte : TTabcompte);

	Var
		i : INTEGER;
		nbCompte : integer;
		
	begin
		i := ID_Client;
		nbCompte := nombreCompte(ID_Client,collectionCompte);
		IF (nbCompte > 0) THEN
			Begin
				WRITELN('Veuillez d''abord supprimer tous les comptes de ce client');
				WRITELN('Taper ENTER pour continuer');READLN();// Permet de figer l'ecran
			End
		ELSE
			begin
				WHILE(i <= collectionClient.nbelement) DO
					BEGIN
						collectionClient.tabclient[i] := collectionClient.tabclient[i+1];
						i:=i+1;
					END;
				collectionClient.nbelement-=1;
				WRITELN('Ce client a ete supprime');
				WRITELN('Taper ENTER pour continuer');READLN();// Permet de figer l'ecran
			end;		
	end;
	
//OK Crée un nouveau client et l'enregistre dans notre collection
PROCEDURE creationClient(VAR collectionClient : TTabClient);

VAR
	clientTemp : Tclient;
	choixSexe: STRING;

BEGIN
	//initialise clientTemp
	clientTemp.nom:='';
	clientTemp.prenom:='';
	clientTemp.naissance:='';
	clientTemp.politesse:='';
	clientTemp.adresse:='';
	clientTemp.npa:='';
	clientTemp.localite:='';
	clientTemp.telephone:='';


   //Saisie des données du client
	WHILE(clientTemp.nom = '') DO
	BEGIN																//Définition du nom du client
		WRITELN('Entrez un nom :');
		READLN(clientTemp.nom);
		IF (clientTemp.nom = '') THEN
			WRITELN('Il est obligatoire de saisir un nom');
	END;


	WHILE (clientTemp.prenom = '')	DO	
	BEGIN																//Définition du prénom du client
		WRITELN('Entrez un prenom :');
		READLN(clientTemp.prenom);
		IF (clientTemp.prenom = '') THEN
			WRITELN('Il est obligatoire de saisir un prenom');
	END;
	
	WHILE(clientTemp.naissance = '')	DO
	BEGIN																//Définition de la date de naissance du client
		WRITELN('Entrez une date de naissance :');
		READLN(clientTemp.naissance);
		IF (clientTemp.naissance = '') THEN
			WRITELN('Il est obligatoire de saisir une date de naissance');
	END;

	WHILE(clientTemp.politesse = '')	DO
	BEGIN																//Définition de la formule de politesse du client
		WRITELN('Entrez la politesse de la personne :');
		WRITELN('1. Monsieur');
		WRITELN('2. Madame');
		READLN (choixSexe);
			CASE (choixSexe) OF
				'1':
					begin
						clienttemp.politesse := 'Monsieur';
					end;
				'2':
					begin
						clienttemp.politesse := 'Madame';
					end;	
			end;		
		{READLN(clientTemp.politesse);
		IF (clientTemp.politesse = '') THEN
			WRITELN('Il est obligatoire de saisir une politesse');}
	END;

	WHILE(clientTemp.adresse = '')	DO
	BEGIN																//Définition de l'adresse du client
		WRITELN('Entrez une adresse');
		READLN(clientTemp.adresse);
		IF (clientTemp.adresse = '') THEN
			WRITELN('Il est obligatoire de saisir une adresse :');
	END;

	WHILE(clientTemp.npa = '')	DO	
	BEGIN																//Définition du code postal du client
		WRITELN('Entrez un code postal :');
		READLN(clientTemp.npa);
		IF (clientTemp.npa = '') THEN
			WRITELN('Il est obligatoire de saisir un code postal');
		
	END;

	WHILE(clientTemp.localite = '')	DO
	BEGIN																//Définition de la localité du client
		WRITELN('Entrez une localite :');
		READLN(clientTemp.localite);
		IF (clientTemp.localite = '') THEN
			WRITELN('Il est obligatoire de saisir un lieu de residence');
	END;

	WHILE(clientTemp.telephone = '') DO	
	BEGIN																//Définition du numéro de téléphone du client
		WRITELN('Entrez un numero de telephone :');
		READLN(clientTemp.telephone);
		IF (clientTemp.telephone = '') THEN
			WRITELN('Il est obligatoire de saisir un numero de telephone');
			
	
	END;
	addClient(collectionClient,clientTemp);
	
END;

//OK Ajoute un nouveau client à notre collection 
Procedure addClient(var collectionClient : TTabClient; client : TClient);

begin
	collectionClient.nbelement := collectionClient.nbelement + 1;
	collectionClient.DernierIDClient := collectionClient.DernierIDClient + 1;
	client.ID := collectionClient.DernierIDClient;
	collectionClient.tabclient[collectionClient.nbelement] := client;
end;	

//OK Enregistre les modifications faites sur un client existant
Procedure enregistrementClient(ID_Client : integer; var collectionClient : TTabClient; client : TClient);		//Définition du nom de notre procédure ainsi que ses paramètres en entrée-sortie

VAR
	i:Integer;
BEGIN																								//On appelle l'enregistrement dans la fonction qui crée ou modifie un client 
	i:= indiceClient(ID_Client,collectionClient);
	{IF(i<0) THEN BEGIN
		collectionClient.nbelement:=collectionClient.nbelement+1;
		i:=collectionClient.nbelement;											// Le client n'existe pas encore on le creer
	END;}
	collectionClient.tabclient[i]:=client;
END;	
	
//OK Retourne le client présent à la case i de la collection
FUNCTION findClient(collectionClient:TTabClient; i:INTEGER): TClient;
	begin
		findClient := collectionClient.tabclient[i];
	end;
	
//OK Affiche la liste des client puis demande l'indice désiré à l'utilisateur
Function selectClient(collectionClient : TTabClient): INTEGER;
		Var
			indice : integer;
		begin
			WRITE('Saississez l''indice de votre client : ');
			READLN(indice);
			selectClient := indice; 
			end;

//OK Retourne l'ID du client en fonction de son emplacement dans la collection
function id(i : integer ; collectionClient : TTabClient) : integer;
	begin
		id := collectionClient.tabclient[i].ID;
	end;
	
{//Calcule le nombre de compte(s) qu'a notre client	
Function nombreCompte(ID_client: INTEGER; collectionCompte : TTabcompte): INTEGER;
	VAR
		i:INTEGER;
		j:INTEGER;
		comptepos:INTEGER;
		
	BEGIN
		i := ID_client;
		j := 1;
		comptepos := 0;
		WHILE(j <= collectionCompte.nbcompte) DO
			BEGIN
				IF(i = collectionCompte.tabcompte[j].IDclient) THEN
					BEGIN					
						comptepos := comptepos + 1;					
					END;
					j := j + 1;		
			END;
			nombreCompte := comptepos;
	END;}
END.
